# encoding: utf-8
from pyo import *

### Tres bien! Belle exploration. Comme les differentes approches sont assez similaires
### en terme d'implementation, je me demande si ce ne serait pas possible d'uniformiser
### le tout et de donner le choix du processus sonore a l'utilisateur (menu deroulant ou
### commande menu par exemple)... Une idee comme ca! On regarde l'histoire des delais en classe...
### 19/20 

class Grain:
    def __init__(self):
        ### Place un son de test dans les sources et appelle le par un path relatif. Comme ca
        ### on peut tester sur n'importe quelle machine sans modifier le script.
        #self.table = SndTable('/Users/vincentmonastesse/Desktop/IWould...QuestionCprDelay2.AIFF')
        self.table = SndTable(SNDS_PATH+"/transparent.aif")
        self.sndDur = self.table.getDur()

        self.env = HannTable()
        
        self.grnX = SigTo(value=0.5, time=0.05, init=0.5)
        self.grnY = SigTo(value=0.5, time=0.05, init=0.5)
        self.grnZ = Sig(0.001)  # Correspond au parametre 'z' de l'interface tactile
        
        self.phase = Phasor(freq=self.table.getRate()*self.grnX, phase=0, mul=self.table.getSize(), add=Noise(10))


        self.dur = Noise(mul=Clip(self.grnZ, min=0, max=1.), add=.1)

        self.grain = Granulator( table=self.table,    
                            env=self.env,        
                            pitch=self.grnY,      
                            pos=self.phase,        
                            dur=self.dur,        
                            grains=40,      
                            basedur=.1,      
                            mul=.1).mix(2)
                            
    def changeTable(self, snd):
        self.table.sound = snd
    
    def changeX(self, x):
        self.grnX.value = x

    def changeY(self, y):
        self.grnY.value = y
    
    def grainDur(self,z):
        self.grnZ.value = z

    def sig(self):
        return self.grain

class FxSwitch:
    def __init__(self,input,fx='Reverb'):
        self.fx = fx
        self.input = input
        
        self.fxX = SigTo(value=0.5, time=0.05, init=0.5)
        self.fxY = SigTo(value=0.5, time=0.05, init=0.5)
        self.fxZ = SigTo(.5)
        
        self.delay = Delay(self.input, maxdelay=10, delay=self.fxX*4, feedback=self.fxY).stop()
        self.disto = Disto(self.input, drive=self.fxX, slope=self.fxY, 
                           mul=.5).stop()
        self.degrade = Degrade(self.input, bitdepth=Sig(self.fxX,mul=20,add=2),
                               srscale=Sig(self.fxY,mul=.99,add=.01),
                               mul=1.5).stop()
        self.reverb = Freeverb(self.input, size=self.fxX, 
                             damp=self.fxY, bal=self.fxZ, mul=1, add=0).stop()
        self.harmo = Harmonizer(self.input, 
                                transpo=Sig(self.fxX, mul=24, add=-12),
                                feedback=self.fxY, winsize=1).stop()
        self.fx_dict = {'Reverb': self.reverb, 'Disto': self.disto, 
                        'Degrade': self.degrade, 'Delay': self.delay, 
                        'Harmonizer': self.harmo}
        self.fx_dict[fx].out()
        
    def changeFx(self, fx):
        self.fx_dict[self.fx].stop()
        self.fx_dict[fx].out()
        self.fx = fx
        
    def changeX(self, x):
        self.fxX.value = x

    def changeY(self, y):
        self.fxY.value = y
        
    def setRatio(self, z):
        self.fxZ.value = z
        
   
